package expression

import (
	"errors"
	"fmt"
	"gitee.com/huanminabc/go-utils/code_analysis"
	"go-CodeAnalysis/container"
	"go-CodeAnalysis/general"
)

func TokenToAssignExpression(index *int, tokens []code_analysis.Token) error {

	//长度必须大于2,因为name=xxx;至少有3个token
	if len(tokens[*index:]) < 3 {
		return errors.New(fmt.Sprintf("错误代码: line:%d col[%d-%d] is not a assign expression", tokens[*index].Line, tokens[*index].ColumnStart, tokens[*index].ColumnEnd))
	}
	//判断下一个token是否为IDENTIFIER,如果不是则返回错误   ,比如:name=xxx  ,name就是IDENTIFIER
	if tokens[*index].Type != code_analysis.IDENTIFIER {
		return errors.New(fmt.Sprintf("错误代码: line:%d col[%d-%d] is not a identifier", tokens[*index+1].Line, tokens[*index+1].ColumnStart, tokens[*index+1].ColumnEnd))
	}
	//判断是否存在
	if !container.IsGlobalVariable(tokens[*index].Value) {
		return errors.New(fmt.Sprintf("错误代码: line:%d col[%d-%d] is not a global variable", tokens[*index].Line, tokens[*index].ColumnStart, tokens[*index].ColumnEnd))
	}
	//判断下一个token是否为OPERATOR,并且值为=,如果不是则返回错误
	if tokens[*index+1].Type != code_analysis.OPERATOR || tokens[*index+1].Value != "=" {
		return errors.New(fmt.Sprintf("错误代码: line:%d col[%d-%d] is not a operator", tokens[*index+2].Line, tokens[*index+2].ColumnStart, tokens[*index+2].ColumnEnd))
	}
	var varName = tokens[*index].Value
	// 截取token到;结束
	var newTokens []code_analysis.Token
	for i := *index + 2; i < len(tokens); i++ {
		//如果遇到有字符串那么报错
		if tokens[i].ValueType == code_analysis.STRING {
			return errors.New(fmt.Sprintf("错误代码: line:%d col[%d-%d] is a string", tokens[i].Line, tokens[i].ColumnStart, tokens[i].ColumnEnd))
		}
		//如果有遇到字符
		if tokens[i].ValueType == code_analysis.CHAR {
			return errors.New(fmt.Sprintf("错误代码: line:%d col[%d-%d] is a character", tokens[i].Line, tokens[i].ColumnStart, tokens[i].ColumnEnd))
		}
		//如果遇到有字符串模板那么报错
		if tokens[i].ValueType == code_analysis.STRING_TEMPLATE {
			return errors.New(fmt.Sprintf("错误代码: line:%d col[%d-%d] is a string template", tokens[i].Line, tokens[i].ColumnStart, tokens[i].ColumnEnd))
		}

		if tokens[i].Type == code_analysis.SYMBOL && tokens[i].Value == ";" {
			newTokens = tokens[*index+2 : i]
			*index = i //跳过;
			break
		}
	}
	//将identifier的值取出来,然后替换成constant,这样后面才能计算
	general.IdentifierToConstant(newTokens)
	//计算表达式
	expression := CalculateCore(newTokens)
	//修改全局变量
	container.ModifyGlobalVariable(varName, expression)
	return nil
}
